# -*- coding: utf-8 -*-

#测试一维序和二维序的寻址速度
#基本持平(包括transpose的)，相差大概最多只有5%
#但是如果是针对特殊的行/列作运算，速度下降极快，至少有2个数量级
#   发现问题主要出在 sum(a)与a.sum()的差距上，这个有数量级的差别。估计类似的差别在别的函数上也会有体现
#   这个是我的原因，居然直接用了python的sum，而不是np.sum，倒!!!!!!!
#   去除这个因素，则性能损失大概在50%左右
#因此，在计算之前将数据整理好还是有效果的


import numpy as np
from time import time

x=np.arange(20000)
x.shape=4000,5

y=np.arange(20000)
y.shape=5,4000

z=x.transpose()


def r1():
    for i in xrange(5):
        m=np.sum(x[:,i])   #居然这个操作比x.sum(0)要慢2个数量级,而实际上处理的数据是x.sum(0)多很多
        #m=x.sum(0)
        #m=x[:,i].sum()  #正解
    return m

def r2():
    for i in xrange(5):
        m=np.sum(y[i]) #居然这个操作比y.sum(1)要慢2个数量级，而实际上处理的数据是y.sum(1)多很多
        #m=y.sum(1)
        #m=y[i].sum()
    return m


if __name__ == '__main__':
    times = 10000
    b=time()
    for i in xrange(times):
        m=x.sum(0)
    e=time()
    print e-b
    print m

    b=time()
    for i in xrange(times):
        m=y.sum(1)
    e=time()
    print e-b
    print m

    b=time()
    for i in xrange(times):
        m=np.sum(x,0)  #这个极其耗费时间
    e=time()
    print e-b
    print m

    b=time()
    for i in xrange(times):
        m=z.sum(1)
    e=time()
    print e-b
    print m


    b=time()
    for i in xrange(times):
        m=r1()
    e=time()
    print e-b
    print m

    b=time()
    for i in xrange(times):
        m=r2()
    e=time()
    print e-b
    print m

